package alocador.util;

import alocador.exceptions.DataInvalidaException;
import alocador.exceptions.EventoInvalidoException;
import alocador.exceptions.EventoNaoExistenteException;
import alocador.exceptions.SalaInvalidaException;
import alocador.gerenciadores.GerenciadorDeAlocacao;
import alocador.gerenciadores.GerenciadorDeEventos;
import alocador.gerenciadores.GerenciadorDeSalas;
import alocador.persistencia.PersistenciaObserver;

public class SistemaAlocacaoSalasFacade {

	private GerenciadorDeAlocacao gerenciaAlocacao;
	private GerenciadorDeEventos gerenciaEventos;
	private GerenciadorDeSalas gerenciaSalas;

	public SistemaAlocacaoSalasFacade() {
		carregaSistema();

	}

	public void carregaSistema() {
		gerenciaAlocacao = GerenciadorDeAlocacao.getInstance();
		gerenciaSalas = GerenciadorDeSalas.getInstance();
		gerenciaEventos = GerenciadorDeEventos.getInstance();

		PersistenciaObserver.registrar(gerenciaAlocacao);
		PersistenciaObserver.registrar(gerenciaEventos);
		PersistenciaObserver.registrar(gerenciaSalas);

	}

	public void encerrarSistema() {
		PersistenciaObserver.gravarDados();

	}

	public void zerarSistema() {
		PersistenciaObserver.zerarDados();
	}

	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo) throws Exception {
		gerenciaSalas.adicionaSala(id, capacidade, finalidade, tipo);
	}

	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo, String apelido) throws Exception {
		gerenciaSalas.adicionaSala(id, capacidade, finalidade, tipo, apelido);
	}

	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo, String apelido, boolean aberta) throws Exception {
		gerenciaSalas.adicionaSala(id, capacidade, finalidade, tipo, apelido,
				aberta);
	}

	public String getAtributoSala(String id, String atributo) throws Exception {

		if (atributo.equalsIgnoreCase("finalidade")) {
			return gerenciaSalas.getSala(id).getClassificacao();

		} else if (atributo.equalsIgnoreCase("capacidade")) {
			return String.valueOf(gerenciaSalas.getSala(id).getCapacidade());

		} else if (atributo.equalsIgnoreCase("apelido")) {
			return gerenciaSalas.getSala(id).getApelido();

		} else if (atributo.equalsIgnoreCase("tipo")) {
			return gerenciaSalas.getSala(id).getSubTipo();
		} else {
			throw new Exception("Atributo invalido");
		}

	}

	public void adicionarEvento(String id, String nome, String inicio,
			String fim, String area, String contato)
			throws EventoInvalidoException, DataInvalidaException,
			EventoNaoExistenteException {
		gerenciaEventos.adicionaEvento(id, nome, inicio, fim, area, contato);

	}

	public void adicionarEvento(String id, String nome, String inicio,
			String fim, String area, String contato, int repeticoes)
			throws EventoInvalidoException, DataInvalidaException,
			EventoNaoExistenteException {
		gerenciaEventos.adicionaEvento(id, nome, inicio, fim, area, contato,
				repeticoes);

	}

	public void alocarEvento(String idEvento, String idSala) throws Exception {

		gerenciaAlocacao.alocarEvento(idEvento, idSala);
	}

	public void desalocarEvento(String idEvento)
			throws EventoNaoExistenteException, EventoInvalidoException {

		gerenciaAlocacao.desalocarEvento(idEvento);

	}

	public void cancelarEvento(String idEvento)
			throws EventoNaoExistenteException, EventoInvalidoException {

		gerenciaAlocacao.desalocarEvento(idEvento);
		gerenciaEventos.cancelarEvento(idEvento);

	}

	public void removerSala(String idSala) throws SalaInvalidaException {
		gerenciaAlocacao.desalocarSala(idSala);
		gerenciaSalas.removeSala(idSala);
	}

	public String getAtributoEvento(String id, String atributo)
			throws Exception {

		if (atributo.equals("nome")) {
			return gerenciaEventos.getEvento(id).getNome();

		} else if (atributo.equals("inicio")) {
			return gerenciaEventos.getEvento(id).getInicio();

		} else if (atributo.equals("fim")) {
			return gerenciaEventos.getEvento(id).getFim();

		} else if (atributo.equals("area")) {
			return gerenciaEventos.getEvento(id).getArea();

		} else if (atributo.equals("repeticoes")) {
			return gerenciaEventos.getEvento(id).getRepeticoes() + "";

		} else
			throw new Exception("Atributo nao existe.");
	}

	public String localizarEvento(String atributo, String valor)
			throws Exception {

		if (atributo.equals("nome")) {
			return gerenciaAlocacao.localizaEvento("nome", valor);
		} else if (atributo.equals("contato")) {
			return gerenciaAlocacao.localizaEvento("contato", valor);
		} else if (atributo.equals("horario")) {
			return gerenciaAlocacao.localizaEvento("horario", valor);
		} else {
			throw new Exception("Atributo nao existe.");
		}

	}
}
